package com.hb.C_Lambda表达式和集合


/**
 * 知识点1
 * 1. 默认参数
 */
fun main() {
    test()
    test(2)//默认传给第一个参数
    test(b = 2)//显示指定参数名
    test(a = 2)
    test(1,2)
    println("---知识点2--")
    //知识点2
    println(A().method(1))//2
    println(B().method(2))//3

    println("---知识点3--")
    //知识点3：
    //显示的指定无默认参数的值
    test2(b=3)
    println("--知识点4---")
    //这个函数接收的函数的要求是接收两个参数的无返回值的函数 test函数正好是，前面加两个冒号表示将函数的引用传递进去
    println(::test)//fun test(kotlin.Int, kotlin.Int): kotlin.Unit
    test3(3,5,::test)

    //正常的写法
    test3(3,5, {a,b-> println(a-b)})

    //当函数的最后一个参数要求是函数的时候，可以把最后一个参数提出来写
    test3 (3,5){
            a,b-> println(a-b)
    }

    //前面两个参数使用默认值
    test3 { x, y -> println(x-y)  }

}

fun test(a:Int=0,b:Int=1){
    println(a-b)
}

/**
 * 知识点2：
 * 对于重写的方法来说，子类所拥有的重写方法会使用与父类相同的默认参数值
 * 在重写一个拥有默认参数值的方法时，方法签名中必须要将默认参数值省略掉
 *
 * */


open class A{
    open fun method(a:Int,b:Int=1)=a+b
}

class B:A(){
    override fun method(a: Int, b: Int) =a+b
}

/**
 * 知识点3：
 * 如果一个默认参数位于其他无默认值的参数前面，那么默认值只能通过在调用函数时使用具名参数的方式来使用
 */
fun test2(a:Int=0,b:Int=1){
    println(a-b)
}

/**
 * 知识点4：
 * 函数中的参数是函数。
 * 如果函数的最后一个参数是lambda表达式的时候，而且在调用的时位于圆括号之外，那么就可以不指定lambda表达式的具名参数，即打破知识点3
 */
fun test3(a:Int=0,b:Int=1,compute:(x:Int,y:Int)->Unit){
    compute(a,b)
}
